using System.Resources;

#region Copyright (c) 2003, newtelligence AG. All rights reserved.
/*
// Copyright (c) 2003, newtelligence AG. (http://www.newtelligence.com)
// Original BlogX Source Code: Copyright (c) 2003, Chris Anderson (http://simplegeek.com)
// All rights reserved.
//  
// Redistribution and use in source and binary forms, with or without modification, are permitted 
// provided that the following conditions are met: 
//  
// (1) Redistributions of source code must retain the above copyright notice, this list of 
// conditions and the following disclaimer. 
// (2) Redistributions in binary form must reproduce the above copyright notice, this list of 
// conditions and the following disclaimer in the documentation and/or other materials 
// provided with the distribution. 
// (3) Neither the name of the newtelligence AG nor the names of its contributors may be used 
// to endorse or promote products derived from this software without specific prior 
// written permission.
//      
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// -------------------------------------------------------------------------
//
// Original BlogX source code (c) 2003 by Chris Anderson (http://simplegeek.com)
// 
// newtelligence is a registered trademark of newtelligence Aktiengesellschaft.
// 
// For portions of this software, the some additional copyright notices may apply 
// which can either be found in the license.txt file included in the source distribution
// or following this notice. 
//
*/
#endregion


namespace newtelligence.DasBlog.Web
{
    using System;
    using System.Configuration;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Collections;
    using System.Text.RegularExpressions;
    using newtelligence.DasBlog.Runtime;
    using newtelligence.DasBlog.Web.Core;
	using System.Text; 
	using System.Security.Cryptography; 

    /// <summary>
    ///		Summary description for EntryView.
    /// </summary>
    public abstract class SingleCommentView : System.Web.UI.UserControl
    {
        
        Comment comment;
        bool obfuscateEmail = true;

        public bool ObfuscateEmail { get { return obfuscateEmail; } set { obfuscateEmail = value; } }

        public Comment Comment 
        {
            get
            {
                return comment;
            }
            set
            {
                comment = value;
            }
        }

        
        private void Page_Load(object sender, System.EventArgs e)
        {
            
            // Put user code to initialize the page here
        }

		#region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
		
        ///		Required method for Designer support - do not modify
        ///		the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);
            this.PreRender += new System.EventHandler(this.Page_PreRender);

        }
		#endregion

        private string FixUrl( string url )
        {
            if ( url != null && url.Length > 0 )
            {
                if ( url.ToLower().StartsWith("http://"))
                {
                    return url;
                }
                else
                {
                    return "http://" + url;
                }
            }
            else
            {
                return url;
            }
        }

        private void Page_PreRender(object sender, System.EventArgs e)
        {
            SharedBasePage requestPage = Page as SharedBasePage;

            Control root = this;
            HtmlGenericControl entry = new HtmlGenericControl("div");
            entry.Attributes["class"] = "commentBoxStyle";
            root.Controls.Add(entry);

            HtmlGenericControl entryTitle = new HtmlGenericControl("div");
            entryTitle.Attributes["class"] = "commentDateStyle";
            
			//Add the unique anchor for each comment
			HtmlAnchor anchor = new HtmlAnchor();
			anchor.Name = comment.EntryId;
			entryTitle.Controls.Add(anchor);

			if ( requestPage.SiteConfig.AdjustDisplayTimeZone )
            {
                entryTitle.Controls.Add(new LiteralControl( requestPage.SiteConfig.GetConfiguredTimeZone().FormatAdjustedUniversalTime(comment.CreatedUtc) ));
            }
            else
            {
                entryTitle.Controls.Add(new LiteralControl(comment.CreatedUtc.ToString("U")+" UTC"));
            }
            entry.Controls.Add(entryTitle);






            HtmlGenericControl entryBody = new HtmlGenericControl("div");
            entryBody.Attributes["class"] = "commentBodyStyle";

			if (comment.Content != null)
			{
				entryBody.Controls.Add(new LiteralControl(Regex.Replace(comment.Content, "\n", "<br />")));
			}

            entry.Controls.Add(entryBody);

            HtmlGenericControl footer = new HtmlGenericControl("div");
            footer.Attributes["class"] = "commentBoxFooterStyle";
            entry.Controls.Add(footer);


			if ( requestPage.SiteConfig.CommentsAllowGravatar )
			{
				string hash = ""; 
				byte[] data, enc; 

				data = Encoding.Default.GetBytes(comment.AuthorEmail); 
				MD5 md5 = new MD5CryptoServiceProvider(); 
				enc = md5.TransformFinalBlock(data, 0, data.Length); 
				foreach(byte b in md5.Hash) 
					hash += Convert.ToString(b, 16).ToLower().PadLeft(2, '0');
				md5.Clear(); 

				string nogravpath = "";
				if(requestPage.SiteConfig.CommentsGravatarNoImgPath != null) 
				{
					if (requestPage.SiteConfig.CommentsGravatarNoImgPath != "")
					{
						if(requestPage.SiteConfig.CommentsGravatarNoImgPath.Substring(0,4) == "http") 
						{
							nogravpath =  "&default=" + Server.UrlEncode(requestPage.SiteConfig.CommentsGravatarNoImgPath);
						}
						else 
						{
							nogravpath =  "&default=" + Server.UrlEncode(requestPage.SiteConfig.Root + requestPage.SiteConfig.CommentsGravatarNoImgPath);
						}
					}
				} 

				string gravborder = "";
				if(requestPage.SiteConfig.CommentsGravatarBorder != null)
				{
					if (requestPage.SiteConfig.CommentsGravatarBorder != "")
					{
						gravborder =  "&border=" + requestPage.SiteConfig.CommentsGravatarBorder;
					}
				} 

				string gravsize = "";
				if(requestPage.SiteConfig.CommentsGravatarSize != null)
				{
					if (requestPage.SiteConfig.CommentsGravatarSize != "")
					{
						gravsize =  "&size=" + requestPage.SiteConfig.CommentsGravatarSize;
					}
				}

				string gravrating = "";
				if(requestPage.SiteConfig.CommentsGravatarRating != null)
				{
					if (requestPage.SiteConfig.CommentsGravatarRating != "")
					{
						gravrating =  "&rating=" + requestPage.SiteConfig.CommentsGravatarRating;
					}
				}

				

				HtmlGenericControl entryGRAVATAR = new HtmlGenericControl("span");
				entryGRAVATAR.Attributes["class"] = "commentGravatarBlock";
				entryGRAVATAR.InnerHtml = "<img class=\"commentGravatar\" src=\"http://www.gravatar.com/avatar.php?gravatar_id=" + hash + gravrating + gravsize + nogravpath  + gravborder + "\"/>";
				footer.Controls.Add(entryGRAVATAR);
			}

            string authorLink = null;
            if (comment.AuthorHomepage != null && comment.AuthorHomepage.Length > 0)
            {
                authorLink = FixUrl(comment.AuthorHomepage);
            }
             else if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
            {
				if ( !requestPage.SiteConfig.SupressEmailAddressDisplay ) 
				{
					authorLink = "mailto:" + Utils.SpamBlocker(comment.AuthorEmail);
				}
            } 
            if (authorLink != null)
            {
                HyperLink link = new HyperLink();
                link.Attributes["class"] = "commentPermalinkStyle";
                link.NavigateUrl = authorLink;
                link.Text = comment.Author;
				link.Attributes.Add("rel", "nofollow");
                footer.Controls.Add(link);
            }
            else
            {
                Label l = new Label();
                l.Attributes["class"] = "commentPermalinkStyle";
                l.Text = comment.Author;
                footer.Controls.Add(l);
            }

			if ( !requestPage.SiteConfig.SupressEmailAddressDisplay ) {
				if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
				{
					footer.Controls.Add(new LiteralControl(" | "));

					HtmlGenericControl mailto = new HtmlGenericControl("span");
					footer.Controls.Add(mailto);

					HyperLink link = new HyperLink();
					link.CssClass = "commentMailToStyle";
					link.NavigateUrl = "mailto:" + Utils.SpamBlocker(comment.AuthorEmail);
					link.Text = Utils.SpamBlocker(comment.AuthorEmail);
					mailto.Controls.Add(link);
				}
			}

            if ( !requestPage.HideAdminTools && SiteSecurity.IsInRole("admin") )
            {
				if (comment.AuthorIPAddress != null && comment.AuthorIPAddress.Length > 0)
				{
					try
					{
						System.Net.IPHostEntry hostInfo = System.Net.Dns.Resolve(comment.AuthorIPAddress);
						footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + " " + hostInfo.HostName + ") "));
					}
					catch
					{
						footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + ") "));
					}
				}

                footer.Controls.Add(new LiteralControl(" "));

				// create delete hyperlink
                HyperLink deleteHl = new HyperLink();
                deleteHl.CssClass = "deleteLinkStyle";
                System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
                img.CssClass = "deleteLinkImageStyle";
                img.ImageUrl = new Uri(new Uri(Utils.GetBaseUrl(requestPage.SiteConfig)),requestPage.GetThemedImageUrl("deletebutton")).ToString();
                img.BorderWidth=0;
                deleteHl.Controls.Add(img);
				deleteHl.NavigateUrl = String.Format("javascript:deleteComment('{0}', '{1}', '{2}')", Comment.TargetEntryId, Comment.EntryId, Comment.Author);

				ResourceManager resmgr = resmgr = ApplicationResourceTable.Get();
				// add the javascript to allow deletion of the comment
				string scriptString = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
				scriptString += "function deleteComment(entryId, commentId, commentFrom)\n";
				scriptString += "{\n";
				scriptString += String.Format("	if(confirm(\"{0} \\n\\n\" + commentFrom))\n", resmgr.GetString("text_delete_confirm"));
				scriptString += "	{\n";
				scriptString += "		location.href=\"deleteItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
				scriptString += "	}\n";
				scriptString += "}\n";
				scriptString += "</script>";

				if(!Page.IsClientScriptBlockRegistered("deleteCommentScript"))
				{
					Page.RegisterClientScriptBlock("deleteCommentScript", scriptString);
				}

				
				footer.Controls.Add(deleteHl);

				// create approve hyperlink, when moderation is enable and comment is not public
				if( requestPage.SiteConfig.CommentsRequireApproval && !Comment.IsPublic ) 
				{
				  
					HyperLink approveHl = new HyperLink();
					approveHl.CssClass = "approveLinkStyle";
					System.Web.UI.WebControls.Image okImg = new System.Web.UI.WebControls.Image();
					okImg.CssClass = "approveImageStyle";
					okImg.ImageUrl = new Uri(new Uri(Utils.GetBaseUrl(requestPage.SiteConfig)),requestPage.GetThemedImageUrl("okbutton-list")).ToString();
					okImg.BorderWidth = 0;
					approveHl.Controls.Add( okImg );
					approveHl.NavigateUrl = String.Format( "javascript:approveComment('{0}', '{1}')", Comment.TargetEntryId, Comment.EntryId);

					string approveScript = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
					approveScript += "function approveComment(entryId, commentId)\n";
					approveScript += "{\n";
					approveScript += "	location.href=\"approveItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
					approveScript += "}\n";
					approveScript += "</script>";

					if( !Page.IsClientScriptBlockRegistered( "approveCommentScript" ) ) 
					{
						Page.RegisterClientScriptBlock( "approveCommentScript", approveScript );
					}

					footer.Controls.Add( approveHl );
				}
            }
        }
    }
}
